package com.share.user.admin.pojos;

import com.share.common.enums.AccountTypeEnum;
import com.share.common.enums.UserStatus;
import com.share.common.enums.UserStatusEnum;
import lombok.Data;

import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;

/**
 * 系统用户实体类
 * <p>对应数据库表：sys_user</p>
 */
@Data
@TableName("sys_user")
public class SysUser implements Serializable {
    @Serial
    private static final long serialVersionUID = 1L;

    /**
     * 主键ID，自增
     */
    @TableId(type = IdType.AUTO)
    private Long id;

    /**
     * 用户唯一标识UUID，用于JWT等场景
     */
    private String uuid;

    /**
     * 账号类型枚举
     * @see AccountTypeEnum
     */
    @TableField("account_type")
    private AccountTypeEnum accountType;

    /**
     * 用户名，唯一
     */
    private String username;

    /**
     * 加密邮箱（AES-GCM加密存储）
     */
    private String email;

    /**
     * 邮箱是否已验证
     */
    private Boolean emailVerified;

    /**
     * 加密手机号（AES-GCM加密存储，E.164格式）
     */
    private String phone;

    /**
     * 手机号是否已验证
     */
    private Boolean phoneVerified;

    /**
     * 密码哈希（Argon2算法）
     */
    private String password;

    /**
     * 用户显示昵称
     */
    private String nickname;

    /**
     * 头像URL地址
     */
    private String avatar;

    /**
     * 用户状态枚举
     * @see UserStatusEnum
     */
    private UserStatusEnum status;

    /**
     * 最后登录IP（IPv4/IPv6二进制存储）
     */
    @TableField("last_login_ip")
    private byte[] lastLoginIp;

    /**
     * 最后登录时间
     */
    @TableField("last_login_time")
    private LocalDateTime lastLoginTime;

    /**
     * 记录创建时间，自动填充
     */
    @TableField(value = "created_at", fill = FieldFill.INSERT)
    private LocalDateTime createdAt;

    /**
     * 记录更新时间，自动填充
     */
    @TableField(value = "updated_at", fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updatedAt;

    /* ---------- 安全控制字段 ---------- */

    /**
     * 是否启用多因素认证(MFA)
     */
    private Boolean mfaEnabled;

    /**
     * 账户是否未过期
     */
    private UserStatus accountNonExpired;

    /**
     * 账户是否未锁定
     */
    private UserStatus accountNonLocked;

    /**
     * 凭证是否未过期
     */
    private UserStatus credentialsNonExpired;

    /**
     * 账户是否启用
     */
    private UserStatus enabled;
    /**
     * 唯一ID
     */
    private String OpenId;
}